home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xfd / developer / sources / asm / pcompress.a < prev    next >
Text File  |  1999-06-14  |  14KB  |  656 lines

  1. * Programmheader
  2. *
  3. *    Name:        PCompress
  4. *    Author:        SDI
  5. *    Distribution:    PD
  6. *    Description:    XFD external decruncher for recognising PCompress
  7. *    Compileropts:    -
  8. *    Linkeropts:    -
  9. *
  10. * 1.0   03.02.98 : first version
  11. * 1.1   04.02.98 : shortend decrunch code a lot, added Anim, Text and Pic
  12. * 1.2   12.02.98 : fixed S-Pic error - uncrunched files got 4 Byte to short
  13. * 1.3   28.02.98 : recog only, when source <= destination
  14. * 1.4   08.08.98 : added CRC check
  15. * 1.5   17.08.98 : added S-Text 1.1 and S-Anim5 1.1 checks
  16. * 1.6   02.11.98 : optimizations
  17. * 1.7   28.11.98 : one check more to prevent bugs
  18. * 1.8   28.01.99 : S-Text bugfix
  19.  
  20.         INCLUDE    "AINCLUDE:IncDirs.i"
  21.         INCLUDE    "lvo.i"
  22.  
  23.         INCLUDE    "libraries/xfdmaster.i"
  24.         INCLUDE    "exec/memory.i"
  25.  
  26.         * head function for tests
  27. *        INCLUDE    "xfdExeHead.a"
  28.  
  29. ForeMan        MOVEQ    #-1,D0        ;security
  30.         RTS
  31.  
  32.         DC.L    XFDF_ID
  33.         DC.W    1,0
  34.         DC.L    0,0,Slave_PCompLH
  35.  
  36.         DC.B    "$VER: PCompress 1.8 (28.01.1999) by SDI",0
  37. N_PCompressLH    DC.B    'PCompress LH Data',0
  38. N_S_Exec    DC.B    'S-Exec Cruncher',0
  39. N_S_Anim    DC.B    'S-Anim5',0
  40. N_S_Text    DC.B    'S-Text',0
  41. N_S_Pic        DC.B    'S-Pic',0
  42.         EVEN
  43.  
  44. Slave_PCompLH    DC.L    Slave_S_Exec    ;next slave
  45.         DC.W    2        ;version
  46.         DC.W    38        ;master version
  47.         DC.L    N_PCompressLH    ;name
  48.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  49.         DC.W    0
  50.         DC.L    RB_PCompressLH    ;recog buffer
  51.         DC.L    DB_PCompressLH    ;decrunch buffer
  52.         DC.L    0        ;recog segment
  53.         DC.L    0        ;decrunch segment
  54.         DC.W    0,0
  55.         DC.L    14        ;MinBufSize
  56.  
  57. Slave_S_Exec    DC.L    Slave_S_Anim    ;next slaves
  58.         DC.W    2        ;version
  59.         DC.W    38        ;master version
  60.         DC.L    N_S_Exec    ;name
  61.         DC.W    XFDPFF_RELOC    ;flags
  62.         DC.W    0
  63.         DC.L    RB_S_Exec    ;recog buffer
  64.         DC.L    DB_S_Exec    ;decrunch buffer
  65.         DC.L    0        ;recog segment
  66.         DC.L    0        ;decrunch segment
  67.         DC.W    0,0
  68.         DC.L    $4EE        ;MinBufSize
  69.  
  70. Slave_S_Anim    DC.L    Slave_S_Text    ;next slave
  71.         DC.W    2        ;version
  72.         DC.W    38        ;master version
  73.         DC.L    N_S_Anim    ;name
  74.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  75.         DC.W    0
  76.         DC.L    RB_S_Anim    ;recog buffer
  77.         DC.L    DB_S_Anim    ;decrunch buffer
  78.         DC.L    0        ;recog segment
  79.         DC.L    0        ;decrunch segment
  80.         DC.W    0,0
  81.         DC.L    $16DC        ;MinBufSize
  82.  
  83. Slave_S_Text    DC.L    Slave_S_Pic    ;next slave
  84.         DC.W    2        ;version
  85.         DC.W    38        ;master version
  86.         DC.L    N_S_Text    ;name
  87.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  88.         DC.W    0
  89.         DC.L    RB_S_Text    ;recog buffer
  90.         DC.L    DB_S_Text    ;decrunch buffer
  91.         DC.L    0        ;recog segment
  92.         DC.L    0        ;decrunch segment
  93.         DC.W    0,0
  94.         DC.L    $3DC        ;MinBufSize
  95.  
  96. Slave_S_Pic    DC.L    0        ;next slave
  97.         DC.W    2        ;version
  98.         DC.W    38        ;master version
  99.         DC.L    N_S_Pic        ;name
  100.         DC.W    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  101.         DC.W    0
  102.         DC.L    RB_S_Pic    ;recog buffer
  103.         DC.L    DB_S_Pic    ;decrunch buffer
  104.         DC.L    0        ;recog segment
  105.         DC.L    0        ;decrunch segment
  106.         DC.W    0,0
  107.         DC.L    $3CD        ;MinBufSize
  108.  
  109. *************************************************************************
  110. *    Recog buffer function: receives buffer + length in A0/D0    *
  111. *    and receives pointer to struct RecogResult in A1        *
  112. *************************************************************************
  113.  
  114. DATAPOS_EXEC    EQU    $4EC
  115. DATAPOS_ANIM    EQU    $11F4
  116. DATAPOS_ANIM1    EQU    $16D8
  117. DATAPOS_TEXT    EQU    $7CC
  118. DATAPOS_PIC    EQU    $706
  119.  
  120. F_ORIGLEN    EQU    2
  121. F_CRNDLEN    EQU    6
  122. F_CHECKSUM    EQU    10
  123. F_DATA        EQU    14
  124.  
  125. RB_PCompressLH    MOVEQ    #0,D0            ; False
  126.  
  127. * optional    DC.L    'PRE',byte-num
  128. * file format:    DC.B    'LH'
  129. *        DC.L    original length
  130. *        DC.L    destination length
  131. *        DC.L    checksum
  132.  
  133.         CMP.W    #"PR",(A0)
  134.         BNE.B    .normal
  135.         CMP.B    #'E',2(A0)
  136.         BNE.B    .No
  137.         ADDQ.L    #4,A0
  138. .normal        CMP.W    #"LH",(A0)
  139.         BNE.B    .No
  140.         MOVE.L    F_ORIGLEN(A0),D1
  141.         CMP.L    F_CRNDLEN(A0),D1 * source greater than destination
  142.         BLE.B    .No
  143.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  144.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  145.         MOVEQ    #1,D0            ; True
  146. .No        RTS
  147.  
  148. RB_S_Exec    MOVEQ    #0,D0            ; False
  149.  
  150.         CMP.L    #$000003F3,(A0)
  151.         BNE.B    .No
  152.         CMP.L    #$204C7200,$F4(A0)
  153.         BNE.B    .No
  154.         CMP.L    #$204C43EC,$168(A0)
  155.         BNE.B    .No
  156.         CMP.L    #$5BCDFFE0,$208(A0)
  157.         BNE.B    .No
  158.         CMP.L    #$04F06700,$21C(A0)
  159.         BNE.B    .No
  160.         CMP.L    #$32330000,$244(A0)
  161.         BNE.B    .No
  162.         CMP.W    #"LH",DATAPOS_EXEC(A0)
  163.         BNE.B    .No
  164.         MOVEQ    #1,D0            ; True
  165. .No        RTS
  166.  
  167. RB_S_Anim    MOVEQ    #0,D0            ; False
  168.  
  169.         CMP.L    #$000003F3,(A0)
  170.         BNE.B    .No
  171.         CMP.L    #$67504A6A,$3C0(A0)
  172.         BNE.B    .Next
  173.         CMP.L    #'BODY',$628(A0)
  174.         BNE.B    .No
  175.         CMP.L    #$4E757022,$F3C(A0)
  176.         BNE.B    .No
  177.         CMP.L    #'Anim',$119C(A0)
  178.         BNE.B    .No
  179.         CMP.W    #"LH",DATAPOS_ANIM(A0)
  180.         BNE.B    .No
  181.         MOVE.L    DATAPOS_ANIM+F_ORIGLEN(A0),D1
  182. .ok        MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  183.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  184.         MOVEQ    #1,D0            ; True
  185. .No        RTS
  186. .Next        CMP.L    #$675A4A6A,$3C8(A0)
  187.         BNE.B    .No
  188.         CMP.L    #'BODY',$692(A0)
  189.         BNE.B    .No
  190.         CMP.L    #$4E757022,$FF6(A0)
  191.         BNE.B    .No
  192.         CMP.L    #'Anim',$1680(A0)
  193.         BNE.B    .No
  194.         CMP.W    #"LH",DATAPOS_ANIM1(A0)
  195.         BNE.B    .No
  196.         MOVE.L    DATAPOS_ANIM1+F_ORIGLEN(A0),D1
  197.         BRA.B    .ok
  198.  
  199. RB_S_Text    MOVEQ    #0,D0            ; False
  200.  
  201.         CMP.L    #$000003F3,(A0)
  202.         BNE.B    .No
  203.         CMP.L    #$93C92C78,$2C(A0)
  204.         BNE.B    .No
  205.         CMP.L    #$4AAC00AC,$38(A0)
  206.         BNE.B    .No
  207.         CMP.L    #$2C780004,$78(A0)
  208.         BNE.B    .No
  209.         CMP.L    #$2B40FFE8,$80(A0)
  210.         BNE.B    .No
  211.         MOVEQ    #1,D0            ; True
  212.         CMP.B    #$FC,$2B(A0)
  213.         BNE.B    .crunched
  214.         MOVE.L    $3D8(A0),xfdrr_FinalTargetLen(A1)
  215.         MOVE.L    $3D8(A0),xfdrr_MinTargetLen(A1)
  216.         RTS
  217. .crunched    CMP.L    #$74787400,DATAPOS_TEXT-4(A0)
  218.         BEQ.B    .do
  219.         SUBQ.L    #4,A0
  220. .do        MOVE.L    DATAPOS_TEXT+F_ORIGLEN(A0),xfdrr_FinalTargetLen(A1)
  221.         MOVE.L    DATAPOS_TEXT+F_ORIGLEN(A0),xfdrr_MinTargetLen(A1)
  222. .No        RTS
  223.  
  224. RB_S_Pic    MOVEQ    #0,D0            ; False
  225.  
  226.         CMP.L    #$000003F3,(A0)
  227.         BNE.B    .No
  228.         CMP.L    #$42ADFFFC,$28(A0)
  229.         BNE.B    .No
  230.         CMP.L    #$00000004,$68(A0)
  231.         BNE.B    .No
  232.         CMP.L    #$201F4E5D,$78(A0)
  233.         BNE.B    .No
  234.         CMP.L    #$4E7543FA,$7C(A0)
  235.         BNE.B    .No
  236.         MOVEQ    #1,D0            ; True
  237.         CMP.B    #$F8,$23(A0)
  238.         BNE.B    .crunched
  239.         MOVE.L    $32A(A0),D1
  240.         ADDQ.L    #8,D1    
  241.         MOVE.L    D1,xfdrr_FinalTargetLen(A1)
  242.         MOVE.L    D1,xfdrr_MinTargetLen(A1)
  243.         RTS
  244. .crunched    MOVE.L    DATAPOS_PIC+F_ORIGLEN(A0),xfdrr_FinalTargetLen(A1)
  245.         MOVE.L    DATAPOS_PIC+F_ORIGLEN(A0),xfdrr_MinTargetLen(A1)
  246. .No        RTS
  247.  
  248. *************************************************************************
  249. *        Copy buffer function for uncrunched files        *
  250. *    receives xfdbiBufferInfo in A0, bufferpos in A4 and size in D0    *
  251. *************************************************************************
  252.  
  253. DoCopy        MOVEM.L    A5-A6,-(A7)
  254.         MOVE.L    4.W,A6
  255.         MOVEA.L    A0,A5
  256.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  257.  
  258.         MOVE.L    xfdbi_UserTargetBuf(A5),A1
  259.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  260.         BNE.B    .copy
  261.  
  262.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  263.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  264.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  265.         JSR    _LVOAllocMem(A6)
  266.         MOVEA.L    D0,A1
  267.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  268.         BEQ.B    .End
  269. .copy        MOVE.L    xfdbi_TargetBufSaveLen(A5),D0
  270.         MOVE.L    A4,A0
  271.         JSR    _LVOCopyMem(A6)
  272.         CLR.W    xfdbi_Error(A5)
  273.         MOVEQ    #1,D0
  274. .End        MOVEM.L    (A7)+,A5-A6
  275.         RTS
  276.  
  277. *************************************************************************
  278. *    Decrunch buffer functions: receives xfdbiBufferInfo in A0    *
  279. *************************************************************************
  280.  
  281. DB_S_Pic    MOVE.L    xfdbi_SourceBuffer(A0),A1
  282.         CMP.B    #$F8,$23(A1)
  283.         BNE.B    .crunched
  284.  
  285.         MOVE.L    A4,-(A7)
  286.         LEA    $326(A1),A4    * source buffer
  287.         MOVE.L    $32A(A1),D0
  288.         ADDQ.L    #8,D0        * source size
  289.         BSR.B    DoCopy
  290.         MOVE.L    (A7)+,A4
  291.         RTS
  292. .crunched    LEA.L    DATAPOS_PIC(A1),A1
  293.         BSR.B    DecLH
  294.         RTS
  295.  
  296. DB_S_Text    MOVE.L    xfdbi_SourceBuffer(A0),A1
  297.         CMP.B    #$FC,$2B(A1)
  298.         BNE.B    .crunched
  299.  
  300.         MOVE.L    A4,-(A7)
  301.         LEA    $3DC(A1),A4    * source buffer
  302.         MOVE.L    $3D8(A1),D0    * source size
  303.         BSR.W    DoCopy
  304.         MOVE.L    (A7)+,A4
  305.         RTS
  306. .crunched    LEA.L    DATAPOS_TEXT(A1),A1
  307.         CMP.L    #$74787400,-4(A1)
  308.         BEQ.B    .do
  309.         SUBQ.L    #4,A1
  310. .do        BSR.B    DecLH
  311.         RTS
  312.  
  313. DB_PCompressLH    MOVE.L    xfdbi_SourceBuffer(A0),A1
  314.         BSR.B    DecLH
  315.         RTS
  316.  
  317. DB_S_Exec    MOVE.L    xfdbi_SourceBuffer(A0),A1
  318.         LEA.L    DATAPOS_EXEC(A1),A1
  319.         BSR.B    DecLH
  320.         RTS
  321.  
  322. DB_S_Anim    MOVE.L    xfdbi_SourceBuffer(A0),A1
  323.         LEA    DATAPOS_ANIM(A1),A1
  324.         CMP.L    #$41495400,-4(A1)
  325.         BEQ.B    .do
  326.         LEA.L    DATAPOS_ANIM1-DATAPOS_ANIM(A1),A1
  327. .do        BSR.B    DecLH
  328.         RTS
  329.  
  330. *************************************************************************
  331. *        real decrunch buffer function for uncrunched files        *
  332. *           receives xfdbiBufferInfo in A0 and bufferpos in A1        *
  333. *************************************************************************
  334.  
  335. DecLH        MOVEM.L    D3/A3-A6,-(A7)
  336.         MOVE.L    A0,A5
  337.         MOVE.L    4.W,A6
  338.         MOVE.L    A1,A4
  339.  
  340.         CMP.W    #"PR",(A4)        * skip PRE0 or PRE1 header
  341.         BNE.B    .calldecr
  342.         ADDQ.L    #4,A4
  343.  
  344. .calldecr    MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
  345.         LEA    F_DATA(A4),A3
  346.         MOVE.L    F_CRNDLEN(A4),D3
  347.         MOVE.L    xfdbi_SourceBufLen(A5),D0
  348.         CMP.L    D0,D3            * crnd size > buffer
  349.         BGE.B    .Err
  350.         
  351.         BSR.W    GetCheckSum
  352.         CMP.L    F_CHECKSUM(A4),D0
  353.         BNE.B    .Err
  354.  
  355.         MOVE.W    #XFDERR_NOMEMORY,xfdbi_Error(A5)
  356.         MOVE.L    F_ORIGLEN(A4),D0
  357.         MOVE.L    xfdbi_UserTargetBuf(A5),A3
  358.         MOVE.L    D0,xfdbi_TargetBufSaveLen(A5)
  359.  
  360.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  361.         BNE.B    .Decrunch
  362.  
  363.         MOVE.L    D0,xfdbi_TargetBufLen(A5)
  364.         MOVE.L    xfdbi_TargetBufMemType(A5),D1
  365.         JSR    _LVOAllocMem(A6)
  366.         MOVE.L    D0,xfdbi_TargetBuffer(A5)
  367.         BEQ.B    .End
  368.         MOVE.L    D0,A3
  369.  
  370. .Decrunch    BSR.B    DecompLH
  371.  
  372.         BTST.B    #XFDFB_USERTARGET,1+xfdbi_Flags(A5)
  373.         BNE.B    .End
  374.         TST.L    D0
  375.         BNE.B    .ok
  376.         MOVE.L    xfdbi_TargetBuffer(A5),A1
  377.         MOVE.L    xfdbi_TargetBufLen(A5),D0
  378.         JSR    _LVOFreeMem(A6)
  379. .Err        MOVEQ    #0,D0
  380.         BRA.B    .End
  381. .ok        CLR.W    xfdbi_Error(A5)
  382.         MOVEQ    #1,D0
  383. .End        MOVEM.L    (A7)+,D3/A3-A6
  384.         RTS
  385.  
  386. *************************************************************************
  387. *           decrunch routine for LH data                *
  388. *                                    *
  389. * This is made of reassembled code from PCompress decomp object code    *
  390. * and S-Exec decrunch header. I removed a lot of obsolete stuff and     *
  391. * made the routine really mem to mem decrunching. Thus it should be a   *
  392. * lot shorter and faster. I hope I catched all the stuff and did not    *
  393. * miss any obsolete code.                        *
  394. *                                    *
  395. *    gets following parameters:                    *
  396. *        A4    source buffer                    *
  397. *        A3    destination buffer                *
  398. *    returns D0: 0 = error                        *
  399. *************************************************************************
  400.  
  401. outbuf        EQU    $4
  402.  
  403. DecompLH    MOVEM.L    D2-D7/A2-A6,-(A7)
  404.         MOVEA.L    4.W,A6
  405.         MOVE.L    #$13EC,D0
  406.         MOVE.L    #MEMF_CLEAR,D1
  407.         JSR    _LVOAllocMem(A6)
  408.         MOVE.L    D0,A6            * table buffer in A6
  409.         TST.L    D0
  410.         BEQ.B    EndDecompLH
  411.  
  412.         MOVE.L    A3,-(A7)        * outbuf in 4(A7)
  413.         MOVE.L    F_ORIGLEN(A4),-(A7)    * uncrndsize in (A7)
  414.         LEA    F_DATA(A4),A5        * input buffer in A5
  415.         BRA.B    DecrLH
  416. EndDecrLH    ADDQ.L    #8,A7
  417.  
  418.         MOVEA.L    A6,A1            * free 13EC buffer
  419.         MOVE.L    #$13EC,D0
  420.         MOVEA.L    4.W,A6
  421.         JSR    _LVOFreeMem(A6)
  422.         MOVEQ    #1,D0                * return value
  423.  
  424. EndDecompLH    MOVEM.L    (A7)+,D2-D7/A2-A6
  425.         RTS
  426.  
  427. DecrLH        MOVEA.L    A6,A0
  428.         MOVEQ    #0,D1
  429.         LEA    $11D4(A6),A1
  430.         MOVEQ    #2,D3
  431.         MOVE.W    #$F,D4
  432.         MOVE.W    #1,D2
  433.         BSR.W    SubLH
  434.         MOVE.W    #7,D3
  435.         MOVE.W    #7,D4
  436.         MOVEQ    #2,D2
  437.         BSR.W    SubLH
  438.         MOVE.W    #$B,D3
  439.         MOVEQ    #3,D4
  440.         MOVEQ    #3,D2
  441.         BSR.W    SubLH
  442.         MOVE.W    #$17,D3
  443.         MOVEQ    #1,D4
  444.         MOVEQ    #4,D2
  445.         BSR.W    SubLH
  446.         MOVE.W    #$F,D3
  447.         CLR.W    D4
  448.         MOVEQ    #5,D2
  449.         BSR.W    SubLH
  450.         LEA    $C60(A6),A1
  451.         LEA    $76E(A6),A2
  452.         MOVEQ    #-2,D0
  453.         MOVEQ    #0,D3
  454.         MOVEQ    #1,D1
  455.         MOVEQ    #2,D2
  456.         MOVE.W    #$013C,D7
  457. L_12E        MOVE.W    D1,(A0)+
  458.         MOVE.W    D0,(A1)+
  459.         MOVE.W    D3,-(A2)
  460.         SUB.W    D2,D0
  461.         ADD.W    D2,D3
  462.         DBRA    D7,L_12E
  463.         MOVEQ    #0,D6
  464.         MOVE.L    #$27A,D7
  465.         MOVEA.L    A6,A0
  466.         LEA    $27A(A6),A1
  467.         LEA    $EDA(A6),A2
  468.         LEA    $76E(A6),A3
  469.         MOVEQ    #4,D4
  470.         MOVEQ    #2,D2
  471.         MOVE.W    #$13B,D1
  472. L_15A        MOVE.W    (A0)+,D0
  473.         ADD.W    (A0)+,D0
  474.         MOVE.W    D0,(A1)+
  475.         MOVE.W    D6,(A2)+
  476.         MOVE.W    D7,(A3)+
  477.         MOVE.W    D7,(A3)+
  478.         ADD.W    D4,D6
  479.         ADD.W    D2,D7
  480.         DBRA    D1,L_15A
  481.         MOVE.W    D1,(A1)
  482.         CLR.W    $0C5E(A6)
  483.         MOVEA.L    outbuf(A7),A1
  484.         LEA    $076E(A6),A4
  485.         LEA    $0C60(A6),A3
  486.         MOVEQ    #1,D4
  487.         MOVEQ    #$F,D5
  488.         MOVE.W    (A5)+,D6    * get data
  489.         BRA.B    L_1C2
  490. L_198        NEG.W    D7
  491.         LSR.W    D4,D7
  492.         SUB.W    D4,D7
  493.         MOVE.B    D7,(A1)+
  494. L_1B2        SUBQ.L    #1,(A7)        * uncrndsize
  495.         BEQ.W    EndDecrLH
  496. L_1C2        MOVE.W    $04F0(A3),D7
  497. L_1C6        ADD.W    D6,D6
  498.         BCC.B    L_1E0
  499.         MOVE.W    2(A3,D7.W),D7
  500.         DBMI    D5,L_1C6
  501.         BMI.B    L_1EA
  502. L_1D8        MOVEQ    #$000F,D5
  503.         MOVE.W    (A5)+,D6    * get data
  504.         BRA.B    L_1C6
  505. L_1E0        MOVE.W    (A3,D7.W),D7
  506.         DBMI    D5,L_1C6
  507.         BPL.B    L_1D8
  508. L_1EA        DBRA    D5,L_1F4
  509.         MOVE.W    (A5)+,D6    * get data
  510.         MOVEQ    #$F,D5
  511. L_1F4        CMPI.W    #-$8000,$4F0(A6)
  512.         BEQ.B    L_252
  513.         MOVE.W    (A4,D7.W),D0
  514. L_202        LEA    (A6,D0.W),A2
  515.         MOVE.W    (A2),D1
  516.         ADD.W    D4,D1
  517.         MOVE.W    D1,(A2)+
  518.         CMP.W    (A2)+,D1
  519.         BLS.B    L_24C
  520. L_210        CMP.W    (A2)+,D1
  521.         BHI.B    L_210
  522.         SUBQ.L    #4,A2
  523.         MOVE.L    A2,D2
  524.         SUB.L    A6,D2
  525.         MOVE.W    (A2),(A6,D0.W)
  526.         MOVE.W    D1,(A2)
  527.         MOVE.W    (A3,D0.W),D1
  528.         BMI.B    L_22A
  529.         MOVE.W    D2,2(A4,D1.W)
  530. L_22A        MOVE.W    D2,(A4,D1.W)
  531.         MOVE.W    (A3,D2.W),D3
  532.         BMI.B    L_238
  533.         MOVE.W    D0,2(A4,D3.W)
  534. L_238        MOVE.W    D1,(A3,D2.W)
  535.         MOVE.W    D0,(A4,D3.W)
  536.         MOVE.W    D3,(A3,D0.W)
  537.         MOVE.W    (A4,D2.W),D0
  538.         BNE.B    L_202
  539.         BRA.B    L_252
  540. L_24C        MOVE.W    (A4,D0.W),D0
  541.         BNE.B    L_202
  542. L_252        CMPI.W    #-$200,D7
  543.         BGE.W    L_198
  544.         CMPI.W    #-$27A,D7
  545.         BLE.W    EndDecrLH
  546. L_266        ROL.W    #8,D6
  547.         SUBQ.W    #7,D5
  548.         BCC.B    L_28E
  549.         MOVEQ    #0,D3
  550.         MOVE.W    (A5)+,D3    * get data
  551.         SWAP    D3
  552.         NEG.W    D5
  553.         ROL.L    D5,D3
  554.         MOVE.W    D3,D1
  555.         OR.B    D6,D1
  556.         SWAP    D3
  557.         MOVE.W    D3,D6
  558.         NEG.W    D5
  559.         MOVEQ    #$F,D2
  560.         ADD.W    D2,D5
  561.         BRA.B    L_29E
  562.  
  563. L_28E        MOVEQ    #0,D1
  564.         MOVE.B    D6,D1
  565.         CLR.B    D6
  566.         DBRA    D5,L_29E
  567.         MOVE.W    (A5)+,D6    * get data
  568.         MOVEQ    #$F,D5
  569. L_29E        MOVE.W    D1,D3
  570.         ADD.W    D3,D3
  571.         LEA    $1194(A6),A2
  572.         MOVE.W    (A2,D3.W),D3
  573.         CLR.W    D2
  574.         MOVE.B    D3,D2
  575.         CLR.B    D3
  576.         LSR.W    #2,D3
  577. L_2BA        ADD.W    D6,D6
  578.         ADDX    D1,D1
  579.         DBRA    D5,L_2C8
  580.         MOVEQ    #$F,D5
  581.         MOVE.W    (A5)+,D6    * get data
  582. L_2C8        DBRA    D2,L_2BA
  583.         ANDI.W    #$3F,D1
  584.         OR.W    D3,D1
  585.         MOVEA.L    A1,A2
  586.         SUBA.L    D1,A2
  587.         CLR.L    D3
  588.         MOVE.W    D7,D3
  589.         ADDI.L    #$202,D3
  590.         BEQ.W    L_1C2
  591.         NEG.W    D3
  592.         ROR.W    #1,D3
  593. L_2FE        MOVE.B    (A2)+,(A1)+
  594.         SUBQ.L    #1,(A7)        * uncrndsize
  595.         BEQ.W    EndDecrLH
  596.         DBRA    D3,L_2FE
  597.         BRA.W    L_1C2
  598.  
  599. SubLH        ADDQ.W    #1,D1
  600.         MOVE.W    D4,D0
  601. .SubLH_1    MOVE.B    D1,(A1)+
  602.         MOVE.B    D2,(A1)+
  603.         DBRA    D0,.SubLH_1
  604.         DBRA    D3,SubLH
  605.         RTS    
  606.  
  607. *************************************************************************
  608. *         checksum calculation routine                 *
  609. *                                    *
  610. * This is made of reassembled code from PCompress.            *
  611. *                                    *
  612. *    gets following parameters:                    *
  613. *        A3    buffer                        *
  614. *            D3    buffersize                    *
  615. *    returns D0:    checksum                    *
  616. *************************************************************************
  617.  
  618. GetCheckSum    MOVEM.L    D2-D5/A3,-(A7)
  619.         LEA    -$400(A7),A7        * get work buffer
  620.  
  621.         MOVEQ    #0,D1
  622.         ST    D1
  623. .Loop1        MOVEQ    #0,D2
  624.         MOVE.L    D1,D5
  625.         ADD.L    D5,D5
  626.         MOVEQ    #7,D4
  627. .Loop2        ASR.L    #1,D5
  628.         MOVE.L    D5,D0
  629.         EOR.L    D2,D0
  630.         BTST    #0,D0
  631.         BEQ.B    .Skip
  632.         LSR.L    #1,D2
  633.         EORI.L    #$EDB88320,D2
  634.         BRA.B    .Loop2End
  635. .Skip        LSR.L    #1,D2
  636. .Loop2End    DBRA.B    D4,.Loop2
  637.         MOVE.W    D1,D0
  638.         LSL.W    #2,D0
  639.         MOVE.L    D2,(A7,D0.W)
  640.         DBRA    D1,.Loop1
  641.  
  642.         MOVEQ    #0,D0
  643. .SumLoop    MOVEQ    #0,D1
  644.         MOVE.B    (A3)+,D1
  645.         EOR.B    D0,D1
  646.         LSL.W    #2,D1
  647.         LSR.L    #8,D0
  648.         MOVE.L    (A7,D1.W),D1
  649.         EOR.L    D1,D0
  650.         SUBQ.L    #1,D3
  651.         BNE.B    .SumLoop
  652.         LEA    $400(A7),A7            * free work buffer
  653.         MOVEM.L    (A7)+,D2-D5/A3
  654.         RTS
  655.         END
  656.